--[[
@module mq2_task
@summary MQ-2烟雾传感器测试任务
@version 1.0
@date    2024.01.01
@description 演示MQ-2烟雾传感器的使用方法
]]

local sys = require "sys"
local mq2 = require "mq2"

-- 传感器参数配置
local ADC_CHANNEL = adc.ADC0  -- 根据实际连接的ADC通道设置
local LOAD_RESISTANCE = 5000000  -- 5MΩ负载电阻，根据实际电路设置
local PREHEAT_TIME = 300000  -- 5分钟预热时间(毫秒)
local READ_INTERVAL = 2000  -- 2秒读取间隔(毫秒)

-- 阈值设置(可根据需要调整)
local THRESHOLD_LOW = 5000   -- 低浓度阈值
local THRESHOLD_HIGH = 15000  -- 高浓度阈值

-- 主任务
local function mq2_task()
    log.info("mq2_task", "MQ-2烟雾传感器测试任务启动")
    
    -- 初始化ADC
    log.info("mq2_task", "初始化ADC")
    local ret = adc.open(ADC_CHANNEL)
    if not ret then
        log.error("mq2_task", "ADC初始化失败")
        return
    end
    log.info("mq2_task", "ADC初始化成功")
    
    -- 初始化MQ-2传感器
    log.info("mq2_task", "初始化MQ-2传感器")
    ret = mq2.init(ADC_CHANNEL, LOAD_RESISTANCE)
    if not ret then
        log.error("mq2_task", "MQ-2传感器初始化失败")
        return
    end
    log.info("mq2_task", "MQ-2传感器初始化成功")
    
    -- 设置阈值
    mq2.set_threshold(THRESHOLD_LOW, THRESHOLD_HIGH)
    
    -- 预热传感器
    log.info("mq2_task", "开始预热传感器(5分钟)...")
    log.info("mq2_task", "注意：MQ-2传感器需要充分预热才能获得准确读数")
    
    -- 预热过程中，可以添加一个简单的进度显示
    local steps = 10
    local step_time = PREHEAT_TIME / steps
    
    for i = 1, steps do
        local progress = math.floor((i-1)/steps*100)
        log.info("mq2_task", "预热进度: " .. tostring(progress) .. "%")
        sys.wait(step_time)
    end
    
    -- 使用传感器内置的预热函数
    mq2.preheat(0) -- 预热已经完成，这里只是为了设置preheat_done标志
    
    -- 校准传感器
    log.info("mq2_task", "在清洁空气中校准传感器...")
    log.info("mq2_task", "请确保传感器周围是清洁空气环境")
    
    -- 校准前先读取几次，让传感器稳定
    for i = 1, 3 do
        local value = mq2.get_value()
        log.info("mq2_task", "校准前读数 " .. tostring(i) .. ": " .. tostring(value))
        sys.wait(1000)
    end
    
    local r0 = mq2.calibrate(5) -- 使用5次采样进行校准
    if not r0 then
        log.error("mq2_task", "校准失败，使用默认R0值")
    else
        log.info("mq2_task", "校准成功，R0 = " .. tostring(r0) .. "Ω")
    end
    
    log.info("mq2_task", "预热和校准完成，开始连续监测...")
    log.info("mq2_task", "------------------------------------")
    
    -- 主循环，持续读取数据
    while true do
        -- 读取传感器原始值
        local adc_value = mq2.get_value()
        
        -- 读取传感器电阻值
        local rs = mq2.get_rs()
        
        -- 读取估算的PPM值
        local ppm = mq2.get_ppm()
        
        -- 获取状态
        local status = mq2.get_status()
        
        -- 打印读取结果
        log.info("mq2_task", "原始ADC值: " .. tostring(adc_value))
        log.info("mq2_task", "传感器电阻Rs: " .. tostring(rs) .. "Ω")
        log.info("mq2_task", "估算浓度: " .. string.format("%.1f", ppm) .. " ppm")
        log.info("mq2_task", "状态: " .. status)
        
        -- 根据浓度状态添加不同级别的提示
        if status == "高浓度" then
            log.warn("mq2_task", "警告: 检测到高浓度烟雾！")
        elseif status == "低浓度" then
            log.warn("mq2_task", "提示: 检测到低浓度烟雾")
        end
        
        log.info("mq2_task", "------------------------------------")
        
        -- 等待下一次读取
        sys.wait(READ_INTERVAL)
    end
end

-- 启动任务
sys.taskInit(mq2_task)

-- 启动系统任务调度
-- sys.init(0, 0)
-- sys.run()